home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 1 (Walnut Creek)
/
Aminet - June 1993 [Walnut Creek].iso
/
aminet
/
util
/
gnu
/
gnu_smalltalk1_2.lha
/
Interval.st
< prev
next >
Wrap
Text File
|
1992-02-15
|
5KB
|
216 lines
"======================================================================
|
| Interval Method Definitions
|
======================================================================"
"======================================================================
|
| Copyright (C) 1990, 1991, 1992 Free Software Foundation, Inc.
| Written by Steve Byrne.
|
| This file is part of GNU Smalltalk.
|
| GNU Smalltalk is free software; you can redistribute it and/or modify it
| under the terms of the GNU General Public License as published by the Free
| Software Foundation; either version 1, or (at your option) any later version.
|
| GNU Smalltalk is distributed in the hope that it will be useful, but WITHOUT
| ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
| FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
| details.
|
| You should have received a copy of the GNU General Public License along with
| GNU Smalltalk; see the file COPYING. If not, write to the Free Software
| Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
======================================================================"
"
| Change Log
| ============================================================================
| Author Date Change
| sbb 16 Mar 91 Class creation now separate statement.
|
| sbyrne 25 Apr 89 created.
|
"
SequenceableCollection subclass: #Interval
instanceVariableNames: 'start stop step'
classVariableNames: ''
poolDictionaries: ''
category: nil
!
Interval comment:
'My instances represent ranges of objects, typically Magnitude type
objects. I provide iteration/enumeration messages for producing all the
members that my instance represents.' !
!Interval class methodsFor: 'instance creation'!
from: startInteger to: stopInteger by: stepInteger
| int |
^self new initializeFrom: startInteger to: stopInteger by: stepInteger
!
from: startInteger to: stopInteger
^self from: startInteger to: stopInteger by: 1
!!
!Interval methodsFor: 'basic'!
" Note to the reader: these two methods (do: and collect:) are implemented
in this expanded way, instead of just making the whileTrue: condition be a
block that's conditionally assigned based on the sign of step and then
invoking a single whileTrue: loop. However, in this form, the optimizer
can optimize these while loops into direct byte codes and not have to bother
with expensive (relatively) block and method context creation and sending
messages to blocks. "
do: aBlock
| i |
i _ start.
step > 0
ifTrue: [
[ i <= stop ] whileTrue:
[ aBlock value: i.
i _ i + step ]
]
ifFalse: [
[ i >= stop ] whileTrue:
[ aBlock value: i.
i _ i + step ]
]
!
collect: aBlock
| i result j |
result _ self species new: self size.
i _ 1.
j _ start.
step > 0
ifTrue: [
[ j <= stop ]
whileTrue:
[ result at: i put: (aBlock value: j).
j _ j + step.
i _ i + 1 ]
]
ifFalse: [
[ j >= stop ]
whileTrue:
[ result at: i put: (aBlock value: j).
j _ j + step.
i _ i + 1 ]
]
!
size
step > 0
ifTrue: [
stop >= start ifTrue: [ ^(stop - start) // step + 1 ]
ifFalse: [ ^0 ]
]
ifFalse: [
start >= stop ifTrue: [ ^(start - stop) // step + 1 ]
ifFalse: [ ^0 ]
]
!
species
^Array
!
at: index
(index >= 1 and: [index <= self size])
ifTrue: [ ^start + (step * (index - 1)) ]
ifFalse: [ self error: 'subscript out of bounds' ]
!
at: index put: anObject
self error: 'you cannot store into an Interval'
!
add: newObject
self error: 'elements cannot be add3ed to an Interval'
!
remove: newObject
self error: 'elements canot be removed from an Interval'
!!
!Interval methodsFor: 'testing'!
= anInterval
^(start = anInterval start) &
(stop = anInterval stop) &
(step = anInterval step)
!
hash
^(start bitXor: stop) bitXor: step
!!
!Interval methodsFor: 'printing'!
printOn: aStream
aStream nextPutAll: self classNameString.
aStream nextPut: Character space.
start printOn: aStream.
aStream nextPut: $,.
stop printOn: aStream.
aStream nextPut: $,.
step printOn: aStream
!!
!Interval methodsFor: 'storing'!
storeOn: aStream
aStream nextPut: $(.
aStream nextPutAll: self classNameString.
aStream nextPutAll: ' from: '.
start storeOn: aStream.
aStream nextPutAll: ' to: '.
stop storeOn: aStream.
aStream nextPutAll: ' by: '.
step storeOn: aStream.
aStream nextPut: $)
!!
!Interval methodsFor: 'private methods'!
initializeFrom: startInteger to: stopInteger by: stepInteger
start _ startInteger.
stop _ stopInteger.
step _ stepInteger
!
start
^start
!
stop
^stop
!
step
^step
!!